
sys = require("sys")

local ret, config = sys.waitUntil("CONFIG_READY", data)
    --初始化通讯串口
local uartid = 1        -- 根据实际设备选取不同的uartid
local uart485Pin = 24   -- 用于控制485接收和发送的使能引脚
gpio.setup(1, 1)        --打开电源(开发板485供电脚是gpio1，用开发板测试需要开机初始化拉高gpio1)
uart.setup(uartid, config.serialConfig.baudRate, config.serialConfig.dataBits, config.serialConfig.stopBits, config.serialConfig.parity, uart.LSB, 1024, uart485Pin, 0, 2000)
mb_rtu = modbus.create_master(modbus.MODBUS_RTU, uartid, config.serialConfig.baudRate,3000,2000,1,5000)
slaves = {}
bufs = {}
msgs = {}



function init_slave(sensor_config, id)

    -- 创建主站设备，RTU模式
    -- 设置通讯间隔时间，主站将按每隔 设置时间 的频率向从站问询数据（默认100ms），当添加了多个从站后，主站向每个从站问询的时间间隔将叠加
    -- 设置通讯超时时间和消息发送超时重发次数，当主站未在 设置的时间 内接收到从站数据，将向从站再次发送问询（问询次数按设置的 消息超时重发次数 发送，默认1）
    -- 设置断线重连时间间隔，当从站与主站断连后，主站将在设置时间内重新连接从站(默认5000ms)
    local mb_slave = modbus.add_slave(mb_rtu, 1)


    -- 为主站添加从站，从站ID为1，可使用modbus.add_slave(master_handler, slave_id)接口添加多个从站，最多可以添加247个
    local modbus_type = 0
    local modbus_read_or_write = 0
    if sensor_config.modbusType == 3 then
        modbus_type = modbus.REGISTERS
    end

    if sensor_config.functionCode == 0 then
        modbus_read_or_write = modbus.READ
    end

    -- 为从站1创建数据存储区，并创建通讯消息，默认为自动loop模式
    local slave_msg_buf = zbuff.create(1)
    local mb_slave_msg = modbus.create_msg(mb_rtu, mb_slave, modbus_type, modbus_read_or_write, 0, 10, slave_msg_buf)
    slave_msg_buf:clear()
    slaves[id] = mb_slave
    bufs[id] = slave_msg_buf
    msgs[id] = mb_slave_msg
end

function send_request(sensor_config, id)
    local mb_slave = slaves[id]
    local slave_msg_buf = bufs[id]
    local mb_slave_msg = msgs[id]
        -- 获取从站1的状态，每1秒获取一次数据并转换为JSON
    sys.timerLoopStart(function()
        -- 检查从站状态
        local status = modbus.get_slave_state(mb_slave)
        if status == 0 then  -- 0表示正常
            -- 读取缓冲区数据
            slave_msg_buf:seek(0)  -- 重置指针到起始位置
            
            -- 读取4个寄存器的值(每个寄存器2字节)
            local hum = slave_msg_buf:readU16()
            local temp = slave_msg_buf:readU16()
        
            
            -- 创建数据表
            local data = {}
            data[sensor_config].key = slave_msg_buf:readU16() / sensor_config.scaleFactor
            
            -- 转换为JSON
            local json_str = json.encode(data)
            log.info("Modbus数据转JSON:", json_str)
            sys.publish("MQTT_PUB_"..id, data)
        else
            log.warn("从站1状态异常:", status)
        end
    end, config.pollingConfig.pollingInterval)
end

sys.taskInit(function()
    local ret, config = sys.waitUntil("CONFIG_READY", 100000)
    local sensor_config = config['sensorConfig']
    log.info("sensor_config=========="..json.encode(sensor_config))
    local length_sensor = #sensor_config
    for i, v in pairs(sensor_config) do
        log.info("启动485轮询任务, ID:", v.id)
        init_slave(sensor_config, v.id)
    end
    modbus.master_start(mb_rtu)


end)




